/**
 * @author F.biz - http://www.fbiz.com.br/
 */
/// <reference path="../../../lib/jquery-1.2.6.js" />
/*
	Masked Input plugin for jQuery
	Copyright (c) 2007-2009 Josh Bush (digitalbush.com)
	Licensed under the MIT license (http://digitalbush.com/projects/masked-input-plugin/#license) 
	Version: 1.2.2 (03/09/2009 22:39:06)
*/
(function($) {
	var pasteEventName = ($.browser.msie ? 'paste' : 'input') + ".mask";
	var iPhone = (window.orientation != undefined);

	$.mask = {
		//Predefined character definitions
		definitions: {
			'9': "[0-9]",
			'a': "[A-Za-z]",
			'*': "[A-Za-z0-9]"
		}
	};

	$.fn.extend({
		//Helper Function for Caret positioning
		caret: function(begin, end) {
			if (this.length == 0) return;
			if (typeof begin == 'number') {
				end = (typeof end == 'number') ? end : begin;
				return this.each(function() {
					if (this.setSelectionRange) {
						this.focus();
						this.setSelectionRange(begin, end);
					} else if (this.createTextRange) {
						var range = this.createTextRange();
						range.collapse(true);
						range.moveEnd('character', end);
						range.moveStart('character', begin);
						range.select();
					}
				});
			} else {
				if (this[0].setSelectionRange) {
					begin = this[0].selectionStart;
					end = this[0].selectionEnd;
				} else if (document.selection && document.selection.createRange) {
					var range = document.selection.createRange();
					begin = 0 - range.duplicate().moveStart('character', -100000);
					end = begin + range.text.length;
				}
				return { begin: begin, end: end };
			}
		},
		unmask: function() { return this.trigger("unmask"); },
		mask: function(mask, settings) {
			if (!mask && this.length > 0) {
				var input = $(this[0]);
				var tests = input.data("tests");
				return $.map(input.data("buffer"), function(c, i) {
					return tests[i] ? c : null;
				}).join('');
			}
			settings = $.extend({
				placeholder: "_",
				completed: null
			}, settings);

			var defs = $.mask.definitions;
			var tests = [];
			var partialPosition = mask.length;
			var firstNonMaskPos = null;
			var len = mask.length;

			$.each(mask.split(""), function(i, c) {
				if (c == '?') {
					len--;
					partialPosition = i;
				} else if (defs[c]) {
					tests.push(new RegExp(defs[c]));
					if(firstNonMaskPos==null)
						firstNonMaskPos =  tests.length - 1;
				} else {
					tests.push(null);
				}
			});

			return this.each(function() {
				var input = $(this);
				var buffer = $.map(mask.split(""), function(c, i) { if (c != '?') return defs[c] ? settings.placeholder : c });
				var ignore = false;  			//Variable for ignoring control keys
				var focusText = input.val();

				input.data("buffer", buffer).data("tests", tests);

				function seekNext(pos) {
					while (++pos <= len && !tests[pos]);
					return pos;
				};

				function shiftL(pos) {
					while (!tests[pos] && --pos >= 0);
					for (var i = pos; i < len; i++) {
						if (tests[i]) {
							buffer[i] = settings.placeholder;
							var j = seekNext(i);
							if (j < len && tests[i].test(buffer[j])) {
								buffer[i] = buffer[j];
							} else
								break;
						}
					}
					writeBuffer();
					input.caret(Math.max(firstNonMaskPos, pos));
				};

				function shiftR(pos) {
					for (var i = pos, c = settings.placeholder; i < len; i++) {
						if (tests[i]) {
							var j = seekNext(i);
							var t = buffer[i];
							buffer[i] = c;
							if (j < len && tests[j].test(t))
								c = t;
							else
								break;
						}
					}
				};

				function keydownEvent(e) {
					var pos = $(this).caret();
					var k = e.keyCode;
					ignore = (k < 16 || (k > 16 && k < 32) || (k > 32 && k < 41));

					//delete selection before proceeding
					if ((pos.begin - pos.end) != 0 && (!ignore || k == 8 || k == 46))
						clearBuffer(pos.begin, pos.end);

					//backspace, delete, and escape get special treatment
					if (k == 8 || k == 46 || (iPhone && k == 127)) {//backspace/delete
						shiftL(pos.begin + (k == 46 ? 0 : -1));
						return false;
					} else if (k == 27) {//escape
						input.val(focusText);
						input.caret(0, checkVal());
						return false;
					}
				};

				function keypressEvent(e) {
					if (ignore) {
						ignore = false;
						//Fixes Mac FF bug on backspace
						return (e.keyCode == 8) ? false : null;
					}
					e = e || window.event;
					var k = e.charCode || e.keyCode || e.which;
					var pos = $(this).caret();

					if (e.ctrlKey || e.altKey || e.metaKey) {//Ignore
						return true;
					} else if ((k >= 32 && k <= 125) || k > 186) {//typeable characters
						var p = seekNext(pos.begin - 1);
						if (p < len) {
							var c = String.fromCharCode(k);
							if (tests[p].test(c)) {
								shiftR(p);
								buffer[p] = c;
								writeBuffer();
								var next = seekNext(p);
								$(this).caret(next);
								if (settings.completed && next == len)
									settings.completed.call(input);
							}
						}
					}
					return false;
				};

				function clearBuffer(start, end) {
					for (var i = start; i < end && i < len; i++) {
						if (tests[i])
							buffer[i] = settings.placeholder;
					}
				};

				function writeBuffer() { return input.val(buffer.join('')).val(); };

				function checkVal(allow) {
					//try to place characters where they belong
					var test = input.val();
					var lastMatch = -1;
					for (var i = 0, pos = 0; i < len; i++) {
						if (tests[i]) {
							buffer[i] = settings.placeholder;
							while (pos++ < test.length) {
								var c = test.charAt(pos - 1);
								if (tests[i].test(c)) {
									buffer[i] = c;
									lastMatch = i;
									break;
								}
							}
							if (pos > test.length)
								break;
						} else if (buffer[i] == test[pos] && i!=partialPosition) {
							pos++;
							lastMatch = i;
						} 
					}
					if (!allow && lastMatch + 1 < partialPosition) {
						input.val("");
						clearBuffer(0, len);
					} else if (allow || lastMatch + 1 >= partialPosition) {
						writeBuffer();
						if (!allow) input.val(input.val().substring(0, lastMatch + 1));
					}
					return (partialPosition ? i : firstNonMaskPos);
				};

				if (!input.attr("readonly"))
					input
					.one("unmask", function() {
						input
							.unbind(".mask")
							.removeData("buffer")
							.removeData("tests");
					})
					.bind("focus.mask", function() {
						focusText = input.val();
						var pos = checkVal();
						writeBuffer();
						setTimeout(function() {
							if (pos == mask.length)
								input.caret(0, pos);
							else
								input.caret(pos);
						}, 0);
					})
					.bind("blur.mask", function() {
						checkVal();
						if (input.val() != focusText)
							input.change();
					})
					.bind("keydown.mask", keydownEvent)
					.bind("keypress.mask", keypressEvent)
					.bind(pasteEventName, function() {
						setTimeout(function() { input.caret(checkVal(true)); }, 0);
					});

				checkVal(); //Perform initial check for existing values
			});
		}
	});
})(jQuery);
 if(!window['unilever'])
	var unilever = {};
 
 // forms default
 (function($){
	
	if(!$ || !$.validator){
		return;
	}
	
	var _defaultErrorTag = 'span';
	var _defaultErrorMessage = 'Os dados não foram preenchidos corretamente.';
	
    // default validator stuff
	$.validator.messages.minlength = "";
	$.validator.messages.required = "";
	$.validator.messages.number = "";
    $.validator.messages.equalTo = "";
    $.validator.messages.email = "";
    $.validator.messages.CPF = "";    
    $.validator.addMethod("CPF", function(v, element, params) {
        if (v == "00000000000" || v == "11111111111" || v == "22222222222" || v == "33333333333" || v == "44444444444" || v == "55555555555" || v == "66666666666" || v == "77777777777" || v == "88888888888" || v == "99999999999") return false;
        if (!v) return true;
        var s = null;
        var r = null;
        if (v.length != 11 || v.match(/1{11};|2{11};|3{11};|4{11};|5{11};|6{11};|7{11};|8{11};|9{11};|0{11};/)) return false;
        s = 0;
        for (var i = 0; i < 9; i++) s += parseInt(v.charAt(i)) * (10 - i);
        r = 11 - (s % 11);
        if (r == 10 || r == 11) r = 0;
        if (r != parseInt(v.charAt(9))) return false;
        s = 0;
        for (var i = 0; i < 10; i++) s += parseInt(v.charAt(i)) * (11 - i);
        r = 11 - (s % 11);
        if (r == 10 || r == 11) r = 0;
        if (r != parseInt(v.charAt(10))) return false;
        return true;
    });
	
	var _instances = []; // {form: {jQuery}, scopes: [{unilever.Validation}]}
	var _getByForm = function(form){
		var currScopes;
		for(var i = 0; _instances[i]; i++){
			if(_instances[i].form[0] == form[0]){
				return _instances[i];
			}
		}
		return null;
	};
	var _getByInstance = function(form, scope){
		var currScopes;
		var currInstance = _getByForm(form);
		if(currInstance != null){
			currScopes = currInstance.scopes;
			for(var j=0; currScopes[j]; j++){
				if(currScopes[j] == scope){
					return currInstance;
				}
			}
		}
		return null;
	};
	var _addInstance = function(form, scope){
		var currInstance = _getByForm(form);
		var index = _instances.length;
		if(!currInstance){
			_instances[index] = {
				form: form,
				scopes: []
			};
			_instances[index].scopes.push(scope);
		}else{
			if(!_getByInstance(form, scope)){
				currInstance.scopes.push(scope);
			}
		}
	};
	var _resetValidationStatus = function(scope){
		var formGroup = _getByForm(scope.form) || {};
		var scopes = formGroup.scopes || [];
		for(var i = 0; scopes[i]; i++){
			if(scopes[i] != scope){
				scopes[i].currentValidation = false;
			}
		}
	};
	var _getCurrentInstance = function(form){
		var formGroup = _getByForm(form) || {};
		var scopes = formGroup.scopes || [];
		for(var i = 0; scopes[i]; i++){
			if(scopes[i].currentValidation === true){
				return scopes[i];
			}
		}
		return null;
	};
	
	
	var _applyFormValidation = function(scope){
		scope.form.validate({
			errorElement: scope.options.errorElement,
			errorPlacement: function(error, element) {}, 
			submitHandler: scope.options.submitHandler,
			invalidHandler: function(e, validator) {
				var currInstance = _getCurrentInstance(scope.form);
				if(currInstance)
					currInstance.invalidHandler(e, validator);
				return false;
			},
			errorPlacement: function(error, element) {
				error.appendTo( element.next('span'));
			}
		}); 
	};
	
	
	/**
	 * defaults project validation
	 * @param {jQuery} form
	 * @param {jQuery} feedback message holder
	 * @param {jQuery} sendButton form button for on click submit
	 * @param {Object} rules $.validator rules format {nome: {Object}...}
	 * @param {Object} options {errorElement: {String}, message: {String}}
	 * @see {jQuery}, {jQuery.validator}
	 * @needs {jQuery}, {jQuery.validator}
	 */
	unilever.Validation = function(form, feedback, sendButton, rules, options){
		
		_addInstance(form, this);
		
		var _this = this;
		
		if(!feedback || !form){
			throw new Error('[unilever.Validation] feedback and form are needed.');
		}
		
		this.form = form;
		this.feedback = feedback;
		this.sendButton = sendButton;
		this.rules = rules || {};
		this.options = options || {};
		this.currentValidation = false;
		this.invalidHandler = function(e, validator){
			if (validator.numberOfInvalids()) {
				_this.feedback.html(_this.options.message);
			} else {
				_this.feedback.html('&nbsp;');
			}
		}
		this.options.errorElement = this.options.errorElement || _defaultErrorTag;
		this.options.message = this.options.message || _defaultErrorMessage;
		
		var _avoidSubmitHandler = function(){
			_this.form.unbind('submit', _avoidSubmitHandler);
			return false;
		};
		var _removeFormRules = function(){
			$('input, select, textarea', _this.form).each(function(){
				$(this).rules('remove');
			});
		};
		var _addRules = function(){
			_resetValidationStatus(_this);
			for(var name in _this.rules){
				$('*[name='+name+']').rules('add', _this.rules[name]);
			}
		};
		var _applyValidations = function(){
			if(_this.currentValidation === false){
				_this.currentValidation = true;
				_this.form.bind('submit', _avoidSubmitHandler);
				_removeFormRules();
				_addRules();
			}
		}
		var _onKeyPress = function(e){
			if(e.keyCode == 13){
				_applyValidations();
				_this.form.submit();
				return false;
			}
		};
		
		// init
		if(!_this.form.data('validator')){
			_applyFormValidation(this);
		}
		for(var name in this.rules){
			$('*[name='+name+']')
				.bind('keypress', _onKeyPress);
		}
		this.sendButton.bind('click', _applyValidations);
	};
	
 })(jQuery)
